package pl.gettoknowme.mobile.android.model.dao;

import java.util.ArrayList;
import java.util.List;

import pl.gettoknowme.mobile.android.model.dbtypes.Location;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

/**
 * Obiekt DAO dla tabeli 'location'
 * @author Michał Kołodziejski
 */
public class LocationDAO {

    private static final String TABLE_NAME = "location";
    private static final String[] COLUMNS = {
        "id",
        "fetch_time",
        "longitude",
        "latitude"
    };
    
    /**
     * Uchwyt do bazy danych
     */
    private SQLiteDatabase db;

    /**
     * Tworzy obiekt DAO dla tabeli 'location'
     * @param db uchwyt do bazy danych
     */
    public LocationDAO(SQLiteDatabase db) {
        this.db = db;
    }
    
    
    /**
     * Zwraca listę wszystkich lokalizacji posotrowanych po czasie zebrania
     * @return lista wszystkich lokalizacji
     */
    public List<Location> getLocationList(){
        List<Location> result = new ArrayList<Location>();
        Cursor cursor = db.query(TABLE_NAME, COLUMNS, null, null, null, null, COLUMNS[1]);
        
        while(cursor.moveToNext()){
            result.add(readLocationFromCursor(cursor));
        }
        
        cursor.close();
        return result;
    }
    
    /**
     * Wstawia nową lokalizację
     * @param location lokalizacja do dodania
     */
    public void insert(Location location){
        ContentValues contentValues = new ContentValues();
//        contentValues.put(COLUMNS[0], 1); // tu jest autoincrement
        contentValues.put(COLUMNS[1], location.getFetchTime());
        contentValues.put(COLUMNS[2], location.getLongitude());
        contentValues.put(COLUMNS[3], location.getLatitude());
        db.insertOrThrow(TABLE_NAME, null, contentValues);
    }
    
    /**
     * Usuwa wszystkie lokalizacje zapisane w bazie danych
     */
    public void deleteAll(){
        db.delete(TABLE_NAME, null, null);
    }
    
    /**
     * Odczytuje pojedynczą lokalizację z bieżącej pozycji kursora
     * @param cursor kursor
     * @return lokalizacja
     */
    private Location readLocationFromCursor(Cursor cursor){
        Location location = new Location();
        location.setId(cursor.getInt(0));
        location.setFetchTime(cursor.getLong(1));
        location.setLongitude(cursor.getDouble(2));
        location.setLatitude(cursor.getDouble(3));
        return location;
    }
}
